package org.zh.util.management;

import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.util.Arrays;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 简单的垃圾回收监控工具示例，定期收集并展示各垃圾回收器的使用情况
 * 频繁调用 getMemoryManagerMXBeans() 及其相关方法会有一定性能开销，生产环境应适当控制调用频率。
 */
public class GCMonitor {
    public static void main(String[] args) {
        // 创建定时器，每5秒收集一次GC信息
        Timer timer = new Timer("GCMonitor", true);
        timer.schedule(new GCMonitorTask(), 0, 5000);

        System.out.println("垃圾回收监控已启动，按Ctrl+C退出...");

        // 保持主线程运行
        try {
            Thread.sleep(Long.MAX_VALUE);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    static class GCMonitorTask extends TimerTask {
        @Override
        public void run() {
            List<GarbageCollectorMXBean> gcBeans = ManagementFactory.getGarbageCollectorMXBeans();

            System.out.println("\n===== 垃圾回收器统计 (" + new java.util.Date() + ") =====");
            for (GarbageCollectorMXBean gc : gcBeans) {
                System.out.println("\n回收器名称: " + gc.getName());
                System.out.println("管理的内存池: " + Arrays.toString(gc.getMemoryPoolNames()));
                System.out.println("回收次数: " + gc.getCollectionCount());
                System.out.println("回收总耗时: " + gc.getCollectionTime() + "ms");

                // 计算最近5秒的GC情况
                long currentCount = gc.getCollectionCount();
                long currentTime = gc.getCollectionTime();

                // 保存上次统计数据，此处省略具体实现
                // ...


            }
        }
    }
}